#ifndef METADATA_H_
#define METADATA_H_

#include <string>
#include <sstream>
#include <iostream>
#include <list>

using namespace std;

//Clase para guardar datos de datos del archivo.
class Metadata {
public:
	Metadata(char, int);
	Metadata(char,int,int, list<string>&, list<bool>);
	char getTipo();
	int getTamanio();
	int getcantidadDatos();
	void agregarTipoDato(string dato, bool clave);
	list<string>& getTipoDatos()const;
	list<bool>& getTipoDatosClaves()const;
	string Serializacion();
	void imprimir();
	friend ostream& operator <<(ostream& os, const Metadata &m) {
		os << m.tipo;
		os << m.tamanio;
		os << m.cantidadDatos;
		list<string>::const_iterator it2 = m.getTipoDatos().begin();
		list<bool>::const_iterator it = m.getTipoDatosClaves().begin();
		for (int i = 0; i < m.cantidadDatos; i++) {
			os << (*it);//clave
			os << (*it2);//string dato
			it++;
			it2++;
		}
		return os;
	}
	friend istream& operator >>(istream& is, Metadata &m) {
		is >> m.tipo;
		is >> m.tamanio;
		is >> m.cantidadDatos;
		string tipoDato;
		bool clave;
		for (int i = 0; i < m.cantidadDatos; i++) {
			is >> clave;
			is >> tipoDato;
			m.agregarTipoDato(tipoDato,clave);
		}
		return is;
	}

private:
	char tipo;//bloque o registro o texto
	int tamanio;
	int cantidadDatos;
	list<string> datos;//contiene info de los tipos de datos dentro del archivo y su orden de aparicion
	list<bool> datosClaves;//contiene la misma cant e elementos de datos, pero la info si es clave.

};

#endif /*METADATA_H_*/
